package cn.shujuhai.common.controller.role;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.shujuhai.common.aop.SysLog;
import cn.shujuhai.common.domain.PageRequest;
import cn.shujuhai.common.domain.SysRole;
import cn.shujuhai.common.pluging.data.ResultVo;
import cn.shujuhai.common.service.SysRoleService;
import com.github.pagehelper.PageInfo;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author: NiuYaHu
 * @Date: 2024/12/5 12:01
 * @Description: 针对角色的控制层操作
 **/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/role")
public class SysRoleController {
    final SysRoleService sysRoleService;

    /**
     * 分页查询系统角色信息
     *
     * @param roleName    角色名（可为null，不为null时进行模糊查询）
     * @param roleCode    角色代码（可为null，不为null时进行模糊查询）
     * @param pageRequest 分页
     * @return 返回包含分页信息和系统用户列表的ResultVo对象，其中PageInfo<SysUser>包含了分页的详细信息，如总记录数、总页数等
     */
    @SysLog(value = "获取角色列表", operationType = "查询", module = "角色模块")
    @GetMapping("/list")
    public ResultVo<PageInfo<SysRole>> getRoleList
    (@Validated String roleName, @Validated String roleCode, @Valid PageRequest pageRequest) {
        return this.sysRoleService.getSysRolePageInfo(roleName, roleCode, pageRequest.getPageNum(), pageRequest.getPageSize());
    }

    /**
     * 获取角色名称
     *
     * @return 角色集合
     */
    @SysLog(value = "获取个人角色列表", operationType = "查询", module = "角色模块")
    @GetMapping("/personRoleList")
    public ResultVo<?> getRoleList() {
        return this.sysRoleService.getRoleList();
    }

    /**
     * 获取部门角色名称
     *
     * @return 角色名称集合
     */
    @SysLog(value = "获取个人角色列表", operationType = "查询", module = "角色模块")
    @GetMapping("/departmentRoleList")
    public ResultVo<?> getDepartmentRoleList() {
        return this.sysRoleService.getDepartmentRoleList();
    }

    /**
     * 角色新增
     *
     * @param sysRole 角色对象
     * @return 新增的角色对象
     */
    @SysLog(value = "新增角色", operationType = "新增", module = "角色模块")
    @PostMapping("/add")
    public ResultVo<?> save(@Validated @RequestBody SysRole sysRole) {
        return this.sysRoleService.saveRolePermission(sysRole);

    }

    /**
     * 角色编辑
     *
     * @param sysRole 角色对象
     * @return 获取修改角色id, 返回更新后的角色
     */
    @SysLog(value = "角色编辑", operationType = "编辑", module = "角色模块")
    @PostMapping("/update")
    public ResultVo<SysRole> update(@Validated @RequestBody SysRole sysRole) {
        return this.sysRoleService.updateRole(sysRole);
    }

    /**
     * 根据角色ID删除角色信息
     *
     * @param roleId 角色id
     * @return 删除成功或失败的结果及响应信息
     */
    @SysLog(value = "删除角色", operationType = "编辑", module = "角色模块")
    @PostMapping("/delete/{roleId}")
    public ResultVo<SysRole> delete(@PathVariable Integer roleId) {
        return this.sysRoleService.removeId(roleId);
    }

    /**
     * 根据角色ID查询系统角色信息
     *
     * @param roleId 角色id
     * @return 返回对应的系统角色对象（SysRole），如果未找到则返回null
     */
    @SaCheckPermission("role_list")
    @SysLog(value = "根据角色Id获取角色", operationType = "查询", module = "角色模块")
    @GetMapping("/getRoleById/{roleId}")
    public ResultVo<SysRole> getRoleById(@PathVariable Integer roleId) {
        return this.sysRoleService.selectById(roleId);
    }

    /**
     * 启用｜禁用 角色
     *
     * @param roleId 角色id
     * @return 获取修改角色id, 返回更新后的角色
     */
    @SaCheckPermission("role_enable")
    @SysLog(value = "角色启用禁用", operationType = "编辑", module = "角色模块")
    @PostMapping("/enable/{roleId}")
    public ResultVo<SysRole> enable(@PathVariable("roleId") Integer roleId) {
        return this.sysRoleService.enable(roleId);
    }

    /**
     * 根据角色Id获取权限Id
     *
     * @param roleId 角色Id
     * @return 角色对应的权限集合
     */
    @SaCheckPermission("role_list")
    @SysLog(value = "根据角色Id获取权限Id", operationType = "查询", module = "角色模块")
    @GetMapping("/getPermissionIdsByRoleId")
    public ResultVo<?> getPermissionIdsByRoleId(Long roleId) {
        return ResultVo.success(this.sysRoleService.getPermissionIdsByRoleId(roleId));
    }

    /**
     * 根据角色Id获取栏目Id
     *
     * @param roleId 角色Id
     * @return 角色对应的栏目集合
     */
    @SaCheckPermission("role_list")
    @SysLog(value = "根据角色Id获取栏目Id", operationType = "查询", module = "角色模块")
    @GetMapping("/getChannelIdsByRoleId")
    public ResultVo<?> getChannelIdsByRoleId(Long roleId) {
        return ResultVo.success(this.sysRoleService.getChannelIdsByRoleId(roleId));
    }

    /**
     * 根据角色Id获取信息Id
     *
     * @param roleId
     * @return 角色对应的信息集合
     */
    @SaCheckPermission("role_list")
    @SysLog(value = "根据角色Id获取信息Id", operationType = "查询", module = "角色模块")
    @GetMapping("/getInfoIdsByRoleId")
    public ResultVo<?> getInfoIdsByRoleId(Long roleId) {
        return ResultVo.success(this.sysRoleService.getInfoIdsByRoleId(roleId));
    }

    /**
     * 根据角色名获取用户名
     *
     * @param roleId
     * @return 获取到的用户名列表
     */
    @SaCheckPermission("role_list")
    @SysLog(value = "根据角色获取用户名集合", operationType = "查询", module = "角色模块")
    @GetMapping("/getUsernameByRoleId")
    public ResultVo<?> getUsernameByRoleId(Long roleId) {
        return ResultVo.success(this.sysRoleService.getUserIdByRoleId(roleId));
    }
}
